iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
DevOps

一個人也能 DevOps ? 用 Angular + Spring Boot 演示專案由開發到部署系列 第 29

Day29: 參數抽象與模擬雲端部署 - Azure VM

  • 分享至 

  • xImage
  •  

昨天,我們完成了 Sprint 4 的需求與 Backlogs,實現了資料庫的儲存與顏色群組的選擇。今天,就讓我們開啟在鐵人賽裡的最後一期 Sprint,一起來優化與解決問題,並將環境部署到 Azure 雲端上。

Sprint 5

Sprint 5 的目標是處理環境的問題,在前一個 Sprint,我們完成了 DB 的搭建,然而 DB 是建構在 SIT 上面,等於是整合測試與開發工用一個 DB,這其中各有優缺點,好處是開發人員可以共用 DB 的資料,便於溝通與測試;然而這也會讓 application.properties 中對應的 url 無法更改,當我們想要更動的時候,只能重新打包 Image、另外參數的機敏資訊 (如 password) 以明文顯示,會提升使用上的風險。

因此,我們可以將參數抽象出來,並在 Container 要執行時,才將參數以環境變數的方式傳入內部,另外,也能夠搭配加密,來隱藏參數。

再來,我們目前可執行的環境僅為內網的 SIT 機 (192.168.1.188),若要讓別人使用,則需要將 IP 暴露出來,這時就能夠有雲端與地端自有伺服器的選擇,這次,讓我們先將 Container 部署在 Azure VM 上面。

環境變數的抽離

在 application.properties 內,我們能夠依照環境撰寫多支 properties,並以 profile 分別,其命名方法為:

application-.properties

這裡我們在 cct-java 專案的 resourcess 內創建一個新的檔案,名為 application-local.properties,顧名思義,這一個 properties 適用於本地開發,我們能可以在本機的 sql server 內創建相同的 CCT_DB,並建立使用者,再將本地的 sql server 寫入 properties 內。

#application-local.properties
spring.datasource.url=jdbc:sqlserver://localhost:1433;DatabaseName=CCT_DB
spring.datasource.username=cct-user
spring.datasource.password=cct-user-passwd

在啟動 Eclipse 時,我們能夠對專案選擇 Run As => Run Configuration,並在 Profile 內輸入 local,此時 Eclipse 就會啟用 local 的 properties 配置。

https://ithelp.ithome.com.tw/upload/images/20221014/20132878cSJLlqWGgD.png

而針對正式的 application.properties,我們則可以將內部的參數抽離(或說將其抽象),並在 Container 啟動時才以指令放入。

#application.properties
spring.datasource.url=${SQL_SERVER_URL_CCT_DB}
spring.datasource.username=${SQL_SERVER_USR_CCT_DB}
spring.datasource.password=${SQL_SERVER_PASSWD_CCT_DB}

而在 container 啟動時,我們在將參數以環境變數的方式丟入。

sudo docker run \
-e SQL_SERVER_URL_CCT_DB=jdbc:sqlserver://192.168.1.188:1433;DatabaseName=CCT_DB \
-e SQL_SERVER_USR_CCT_DB=username \
-e SQL_SERVER_PASSWD_CCT_DB \
-p 8081:8081 \
-d image name

這裡我們就能將帳密寫於腳本並加密,同時在不同環境下,連線到不同的資料庫了。

Bonus 模擬雲端部署 - Azure VM

關於於雲端的部署,由於 Harbor 建構在地端在外部的網路會無法進入內網,故今天就模擬一下如果 Harbor 建構在雲端或可被外網聯繫的情況下,如何串接 Pipeline。

關於伺服器的選擇,我們能夠使用自行架設的機器建立私有雲 (On-Premises),也能夠向 Azure、AWS、GCP 等雲端商家租用方案;使用自行架設的好處是能夠將所有的資料與保存在公司企業的機房內,目前台灣的一些金融法規會限制不可將資料儲存在台灣之外,也是部分公司架設私有雲的主因;另外自行架設也需要專業的維運團隊管理。

而使用雲端的服務,則可以依照託管程度的不同,又分為 IaaS、SaaS、PaaS,這裡簡單介紹一下:

  • 基礎設施即服務 (Infrastructure as a Service, IaaS):
  • 平臺即服務 (Platform as a Service, PaaS):
  • 軟體即服務 (Software as a Service, SaaS):

當然,想要有越高的自由度,則需要自行管理的內容就越多,而需要負擔的責任也就越大:

SRM

Shared Responsibility model

簡單的介紹了幾個服務類型後,基於我們要同時運作前後端與 DB 三個 Container,我們就來使用 Azure VM 這個 IaaS 服務;而不管使用任何雲端服務之前,我們都一定要去看看定價,Azure 為他們的服務提供了一個定價計算機的功能,能讓我們在搭建之前先計算會花費的價錢。

https://ithelp.ithome.com.tw/upload/images/20221014/201328780QYfGcF3xX.png
(恩...我的荷包君說拍完影片還是果斷關掉吧)

接著,我們就來搭建 Azure VM 吧!這裡我將會使用隨用隨付 (Pay as you go) 方案,並在測試完成後關閉。首先,讓我們一起登入 Azure Protal。另外也推薦想了解 Azure 雲端的夥伴考取 AZ-900 的證照,微軟會不定時發佈線上課程,若完整參與則可獲得免費的考試機會。

登入之後,我們要先建立一個資源群組 (Resource Group),資源群組是免費的,他的設計目的是將相同產品生命週期的服務放置再一起,能夠共同管理。我們點選 Resource Group 的 logo,並點選 Create,接著為 Resource Group 命名,並選擇區域。

https://ithelp.ithome.com.tw/upload/images/20221014/20132878A5ktGo4QeL.png

建立好後,我們可以直接在上方的欄位搜尋虛擬機器 (Virtual machines),並點選 Create,接著選擇資源群組、並為 VM 命名,以及選擇方案;這裡我們選用 password 的方式管理。

https://ithelp.ithome.com.tw/upload/images/20221014/20132878x6992ngYjH.png

建立好後,我們就能在虛擬機器的主頁面看到 Public IP address,就能使用 Putty 遠端連線進去啦,後續的部分我們參考先前的建構流程,為 Ubuntu 安裝 Docker

後續只要依照前幾天的流程完成以下內容(詳細則不贅述):

  1. 在 Gitflow 上開啟新的 Feature,名為 Feature-s5
  2. 將 properties 抽離成參數,並創建 application-local.properties
  3. 在 Azure VM 上以 Container 啟動 SQL Server,並記下帳號密碼
  4. 在 Azure VM 上撰寫部署的腳本,將參數放入,並為其加密
  5. 修正 SIT 機上的腳本,將參數放入,並為其加密
  6. 在 Jenkins 內為 Azure VM 新增 SSH Servers
  7. 在 Jenkins 內新增一個 Job,並先使用 Pipeline Script
  8. Pipeline Script 僅留下 ssh 部署的 stage
  9. 在 Jenkins Build Triggers 內複製 webhook url
  10. 在 Gitlab 專案內原先的 webhook 觸發更改為 Developer
  11. 在 Gitlab 專案內新增剛才創建的 webhook url,並將 Push events 設定成 master
  12. 合併分支

這裡我們分析一下,我們將昨天為止創建的 Webhook 觸發改動成 Developer 分支,當 Developer 更新時,我們則編譯建構 Image 並推送到 Harbor,並拉取後部署。此時我們就能夠先在 SIT 測試,確認沒問題後,我們才繼續向下合併分支,直至 master 被觸發,僅執行拉取與部署,不再次執行打包。

此時我們終極的 Pipeline 與環境對應則長成這樣:

https://ithelp.ithome.com.tw/upload/images/20221014/20132878MEF7LTQxVH.png

比較可惜是這次 Harbor 與 Jenkins 建於地端,想要觸發 CD 很容易受到限制 (如 Gtilab webhook 等),等明年撥一筆預算架設 Harbor 30 天好了

今日總結

今天,我們把 Properties 抽離後,將 Production 環境建構在 Azure VM 上面,並且模擬將其納入了 Pipeline 的範圍內,到此,我們算完成了這次鐵人賽的初衷:

以敏捷的精神,從零開始打造一個簡單的前後端分離網站,並容器化後自動部署於 Linux 伺服器上,再逐一迭代完善功能

而在雲端上其實有非常多的方案能夠達成我們今天的目的,如使用 Azure App Service 部署前後端,搭配 Azure SQL Server 儲存資料,希望未來有機會能跟大家分享不同的部署方式。

明天,終於可以寫一個感人的大結局了。


上一篇
Day28: Gitflow 合併與觸發部署、Backlogs 完善
下一篇
Day30: 參賽心得 - DevOps 從不是一個人的事情
系列文
一個人也能 DevOps ? 用 Angular + Spring Boot 演示專案由開發到部署30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言